package design.pattern.flyweight;

import java.util.HashMap;

/**
 * 工厂类，将该类设计为单例模式
 *
 * @author AtoVio, Winter Yuan
 */
public class BoxFactory {

    private HashMap<String, AbstractBox> map;

    // 声明私有的BoxFactory变量
    private static volatile BoxFactory instance;

    // 在私有构造方法中进行初始化操作
    private BoxFactory() {
        map = new HashMap<>();
        map.put("L", new LBox());
        map.put("O", new OBox());
        map.put("I", new IBox());
    }

    // 实现饿汉式的单例模式，并使用一个方法返回BoxFactory的实例
    public static BoxFactory getInstance() {
        // 第一次判断，如果instance为null，才需要抢占锁
        if (instance == null) {
            synchronized (BoxFactory.class) {
                // 再次判断，如果instance仍然为null，才需要创建实例
                if (instance == null) {
                    instance = new BoxFactory();
                }
            }
        }
        return instance;
    }

    // 根据名称获取图形对象
    public AbstractBox getBox(String name) {
        return map.get(name);
    }
}
